iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0

Argo CD 是一個整合 Kubernetes 的開源 GitOps 框架。是用於在 Kubernetes 上運行和管理作業和應用程式的雲原生工具。即主要目的是應用程式交付。在 Argo 的生態還有 event、Workflows 和 Rollout 等。

核心概念

  1. Application
    提供 Kubernetes 邏輯上的資源,並且定義相關的資源配置來源和希望部署的目的。

https://ithelp.ithome.com.tw/upload/images/20240910/20104688WQR3YPxwqg.png

從上圖來看,部署資源來源包括儲存庫 URL 與目錄。一般來說,儲存庫包含多個目錄,每個部署資源環境也許是一個目錄。如下

Prd
  deploy.yaml
dev
  deploy.yaml
qas
  deploy.yaml

前面章節說明了 Helm Chart 和 Kustomize。對 Argo CD 而言,目錄下面不一定要是標準的 Kubernetes YAML 檔案,其可以整合 Helm 與 Kustomize。

部署的目的地(Destination)定義了資源必須部署的位置,並包括目標 Kubernetes 集群的 API 伺服器位置,以及 Kubernetes 的 namespace 名稱。因此,Argo CD 的應用程式代表部署在 Kubernetes 集群中的環境,並將其連接到存儲在 Git 儲存庫中的所需狀態。

  1. Projec

可以邏輯上對 Argo CD 資源進行分群。這非常靈活的方式用來獨立管理不同的資源。白話的說,想像一下你有一間大公司,裡面有很多個團隊,每個團隊都在開發不同的產品。這些產品就像是一棟棟房子,而 Kubernetes 集群就是蓋房子的地基。而這些房子由 Argo CD 管理,因此會帶來以下優勢

  • 獨立管理
    • 彼此之間不影響,可以獨立運行
  • 洞察力
    • Argo CD 會持續監控應用程式,隨時了解它們的狀態
  • 提高生產力
    • Argo CD 可以自動化很多重複性的工作,讓開發人員有更多時間專注於開發新的功能,提高工作效率。

https://ithelp.ithome.com.tw/upload/images/20240910/20104688ts7UPIfyzn.png

Team-A 只能存取 Project-A 所定義的資源,不能跨越至 Project-B。從圖來看 Project-A 使得 Team-A 只能存取定義的儲存庫 Repo 和 Kubernetes 的 namespace。而部署 Application 資源時會綁定特定的 Project,來讓 Project 進行邏輯上的約束。

Argo CD 架構

直接上官方圖

From https://argo-cd.readthedocs.io/en/stable/

對於 Gitops 概念來看,基本上,只需要 clone 具有 YAML 的 Git 儲存庫,並使用 kubectl diffkubectl apply 來檢測和處理配置上的異動。從圖上來看有很多的階段

  1. Argo CD 與使用者或工具交互
  2. 擷取 YAML 資源清單
  3. 檢測和修復差異
  4. 部署資源

每個階段都有對應的 Argo CD 資源,且每個階段的實作必須以不同的方式進行擴展。一個獨立的 Argo CD 元件負責每個階段。

Repository-server 負責擷取 YAML 資源清單並與 Application Controller 交互。使用者或是第三方工具的交互則可以透過 API Server 服務進行等。上圖只是部分元件,而外的像是有 notification server 或是 ApplicationSet server 等服務,其面相用途有所不同,後面章節會再提到。

安裝 Argo CD 環境

建立 4 個 K3d 環境,一個用於 Argo CD,剩下模擬 dev、qas 與 prd 環境。這些環境可以參考本人的 github。在 K3d 配置檔中 kubeAPI 欄位可依照環境需求進行配置。那預設上是把 Ingress 功能給關閉,所以下面手動安裝了 Ingress Nginx。

建立 Argo CD CD 環境

k3d cluster create -c argocd-conf.yaml --servers-memory 6G --agents-memory 2G

安裝 Ingress 資源

$ helm repo add ingress-nginx  https://kubernetes.github.io/ingress-nginx
$ helm search repo ingress-nginx
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
ingress-nginx/ingress-nginx     4.10.1           1.10.1           Ingress controller for Kubernetes using NGINX a...
$ helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.10.1 --namespace ingress-nginx --create-namespace
$ kubectl get all -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/ingress-nginx-controller-7d5fb757db-gx8hp   1/1     Running   0          2m36s

NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP                        PORT(S)                      AGE
service/ingress-nginx-controller-admission   ClusterIP      10.43.138.141   <none>                             443/TCP                      2m36s
service/ingress-nginx-controller             LoadBalancer   10.43.236.109   172.19.0.2,172.19.0.3,172.19.0.4   80:32369/TCP,443:31027/TCP   2m36s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           2m36s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-7d5fb757db   1         1         1       2m36s

安裝 Argo CD 資源

  1. 定義對應 values.yaml
crds:
  install: true
global:
  domain: argo.cch.com
  logging:
    format: json
    level: info

configs:
  cm:
    create: true
    exec.enabled: false
    admin.enabled: true
    statusbadge.enabled: true
  params:
    create: true
    otlp.address: ''
    server.insecure: false
    server.basehref: /argocd
    server.rootpath: '/argocd'
    server.staticassets: /shared/app
    server.disable.auth: false
    server.enable.gzip: true
    server.x.frame.options: sameorigin
  rbac:
    create: true
    policy.default: ''
    policy.csv: ''
    scopes: "[groups]"
    policy.matchMode: "glob"

redis-ha:
  enabled: true

controller:
  replicas: 1

server:
  autoscaling:
    enabled: true
    minReplicas: 1
  extensions:
    # -- Enable support for Argo CD extensions
    enabled: false
    extensionList: []
    #  - name: extension-metrics
    #    env:
    #      - name: EXTENSION_URL
    #        value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension.tar.gz
    #      - name: EXTENSION_CHECKSUM_URL
    #        value: https://github.com/argoproj-labs/argocd-extension-metrics/releases/download/v1.0.0/extension_checksums.txt
  certificate:
    enabled: false

  # TLS certificate configuration via Secret
  ingress:
    enabled: true
    ingressClassName: "nginx"
    paths:
      - /argocd
    pathType: Prefix
    annotations:
      cert-manager.io/cluster-issuer: letsencrypt-prod
      nginx.ingress.kubernetes.io/ssl-passthrough: "true"
      nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      kubernetes.io/tls-acme: "true"
    tls:
      - secretName: argocd-secret # # do not change, this is provided by Argo CD
        hosts:
          - argo.cch.com
repoServer:
  autoscaling:
    enabled: true
    minReplicas: 2

applicationSet:
  replicaCount: 1
  1. 安裝 Argo CD
$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm search repo argo-cd
NAME            CHART VERSION   APP VERSION     DESCRIPTION
argo/argo-cd    7.1.3           v2.11.3         A Helm chart for Argo CD, a declarative, GitOps...
$ helm install argo-cd argo/argo-cd --version 7.1.3 --namespace argo --create-namespace -f values.yaml
NAME: argo-cd
LAST DEPLOYED: Mon Feb 27 14:54:00 2023
NAMESPACE: argo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
In order to access the server UI you have the following options:

1. kubectl port-forward service/argo-cd-argocd-server -n argo 8080:443

    and then open the browser on http://localhost:8080 and accept the certificate

2. enable ingress in the values file `server.ingress.enabled` and either
      - Add the annotation for ssl passthrough: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-1-ssl-passthrough
      - Set the `configs.params."server.insecure"` in the values file and terminate SSL at your ingress: https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/#option-2-multiple-ingress-objects-and-hosts


After reaching the UI the first time you can login with username: admin and the random password generated during the installation. You can find the password by running:

kubectl -n argo get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

(You should delete the initial secret afterwards as suggested by the Getting Started Guide: https://argo-cd.readthedocs.io/en/stable/getting_started/#4-login-using-the-cli)

到這邊基本上就可以把 Argo CD 環境建置完成了。


上一篇
來看看 Kustomize
下一篇
使用 Argo CD 管理 Kubernetes
系列文
當 Quarkus 想要騎乘駱駝並用8腳章魚掌控舵手 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言